home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Camelot / Camelot 078 (1990-06)(Swedish User Group of Amiga)(SE)(PD)[WB].zip / Camelot 078 (1990-06)(Swedish User Group of Amiga)(SE)(PD)[WB].adf / MemTest / MTest.c < prev    next >
C/C++ Source or Header  |  1990-06-17  |  6KB  |  253 lines

  1.  
  2. #include <stdio.h>
  3. #include <exec/types.h>
  4. #include <exec/memory.h>
  5.  
  6. #define MAXPAT    4L
  7. #define MAXMB     200L
  8. #define SMLST     8L
  9. #define MINLEFT   8L
  10. #define FAST      0L
  11. #define CHIP      1L
  12.  
  13. struct MemBlks
  14.  {
  15.   UBYTE *adx;
  16.   ULONG cnt;
  17.  };
  18.  
  19. struct MemBlks MB = { 0 };
  20. struct MemBlks TMB[2][MAXMB] = { 0 };
  21.  
  22. USHORT dp[4] = { 255,170,85,0 };
  23.  
  24. UBYTE *sa;
  25. ULONG i,k,fav,cav,fnu,cnu,bcnt,inpt,bflag,fflag,cflag,itcnt,mfst,mchp;
  26. ULONG tf,fstcnt,chpcnt;
  27. char  cc;
  28.  
  29. printblocks(type)
  30.  ULONG type;
  31.  {
  32.   ULONG i,av,nu,blkcnt;
  33.  
  34.   if(!type)
  35.    {
  36.     printf("\n\n                   F A S T   M E M O R Y");
  37.     blkcnt=fstcnt;
  38.     nu=fnu;
  39.     av=fav;
  40.    }
  41.   if(type)
  42.    {
  43.     printf("\n\n                   C H I P   M E M O R Y");
  44.     blkcnt=chpcnt;
  45.     nu=cnu;
  46.     av=cav;
  47.    }
  48.   printf("\n\nAvailable %8ld   Allocated %8ld   Free %7ld\n",av,av-nu,nu);
  49.   for(i=0;i<blkcnt;i++)
  50.    {
  51.      printf("\nBlock # %3ld from %8lx ",i+1,TMB[type][i].adx);
  52.      printf(" to %8lx  total %8ld",TMB[type][i].adx+TMB[type][i].cnt,
  53.       TMB[type][i].cnt);
  54.    }
  55.  }
  56.  
  57. UBYTE
  58. checkmem(stadx,chkcnt)
  59.  UBYTE *stadx;
  60.  ULONG chkcnt;
  61.   {
  62.    ULONG i,prntval;
  63.    UWORD expected,received,inpvar,pass;
  64.  
  65.    printf("\n\n  FROM = %8lx   TO = %8lx",stadx,stadx+chkcnt);
  66.    for(pass=0;pass<MAXPAT;pass++)
  67.     {
  68.      expected=dp[pass];
  69.      prntval=dp[pass];
  70.      printf("\n Commence Testing Data Pattern %3lx",prntval);
  71.      for(i=0;i<chkcnt;i++)
  72.       {
  73.        stadx[i]=expected;
  74.        received=stadx[i];
  75.        if(received!=expected)
  76.         {
  77.          printf("\n\n  E R R O R  at address %8lx   ",i+stadx);
  78.          printf("expected = %3x    received = %3x",expected,received);
  79.          printf("\n\n Enter 0 = continue  1 = exit ");
  80.          scanf("%d",&inpvar);
  81.          if(inpvar) return FALSE;
  82.         }
  83.       }
  84.     }
  85.    return TRUE;
  86.   }
  87.  
  88. closeup(fcnt,ccnt)
  89.  ULONG fcnt,ccnt;
  90.  {
  91.   ULONG i;
  92.  
  93.   for(i=0;i<fcnt;i++) FreeMem(TMB[FAST][i].adx,TMB[FAST][i].cnt);
  94.   for(i=0;i<ccnt;i++) FreeMem(TMB[CHIP][i].adx,TMB[CHIP][i].cnt);
  95.   printf("\n\n program complete     { C.A. JAGOW 3/25/87 }\n\n");
  96.   exit();
  97.  }
  98.  
  99. UBYTE
  100. getmem(largest,type)
  101.  ULONG largest,type;
  102.  {
  103.   ULONG trial;
  104.   UBYTE *sadx;
  105.  
  106.   for(trial=largest;trial>SMLST;trial-=SMLST)
  107.    {
  108.     sadx=AllocMem(trial,type);
  109.     if(sadx)
  110.      {
  111.       printf("\n     Allocated %8ld bytes",trial);
  112.       MB.adx=sadx;
  113.       MB.cnt=trial;
  114.       return TRUE;
  115.      }
  116.    }
  117.   return FALSE;
  118.  }
  119.  
  120. testblock(blk,typ)
  121.  ULONG blk,typ;
  122.  {
  123.   ULONG rslt;
  124.   
  125.     printf("\n\nCommence testing block # %3ld",blk+1);
  126.     printf("  From %8lx to %8lx  length %8ld",TMB[typ][blk].adx,
  127.      TMB[typ][blk].adx+TMB[typ][blk].cnt,TMB[typ][blk].cnt);
  128.     for(k=1;k<itcnt+1;k++)
  129.      {
  130.       rslt=checkmem(TMB[typ][blk].adx,TMB[typ][blk].cnt);
  131.       if(rslt) printf("\n      End of pass # %4ld",k);
  132.       if(!rslt) k=itcnt+2;
  133.      }
  134.     if(rslt)
  135.      printf("\n\n     M E M O R Y   T E S T S   G O O D !\n\n");
  136.     if(!rslt)
  137.      printf("\n\n     T E S T   F A I L E D\n");
  138.  }
  139.  
  140. testall(typ)
  141.  ULONG typ;
  142.  {
  143.   ULONG bbcnt,rslt,ii;
  144.  
  145.   if(typ==CHIP) bbcnt=chpcnt;
  146.   if(typ==FAST) bbcnt=fstcnt;
  147.   for(ii=0;ii<bbcnt;ii++)
  148.    {
  149.     printf("\n\nCommence testing from %8lx to %8lx  length %8ld",
  150.      TMB[typ][ii].adx,TMB[typ][ii].adx+TMB[typ][ii].cnt,TMB[typ][ii].cnt);
  151.     rslt=checkmem(TMB[typ][ii].adx,TMB[typ][ii].cnt);
  152.     if(rslt)
  153.      printf("\n\nM E M O R Y   T E S T S   G O O D !\n");
  154.     if(!rslt)
  155.      printf("\n\n     T E S T   F A I L E D\n");
  156.    }
  157.  }
  158.  
  159. main()
  160.  {
  161.   ULONG mtype,mblk,result,ok;
  162.  
  163.   fflag=TRUE;
  164.   cflag=TRUE;
  165.   tf=FALSE;
  166.   fstcnt=0;
  167.   chpcnt=0;
  168.   ok=TRUE;
  169.   printf("\n\n                      M E M O R Y   T E S T   P R O G R A M");
  170.   printf("\n\n\n              ");
  171.   printf("ALL COUNTS ARE DECIMAL, ALL OTHERS ARE HEXIDECIMAL!!\n\n");
  172.   printf("\n\nPlease enter memory type?  ");
  173.   printf(" { 2 = CHIP   1 = FAST   0 = BOTH } ");
  174.   scanf("%ld",&inpt);
  175.   if(inpt)
  176.    {
  177.     if(inpt==2) fflag=FALSE;
  178.     if(inpt==1) cflag=FALSE;
  179.    }
  180.   printf("\n\n   Please standby......   I need to allocate selected memory");
  181.   if(fflag)
  182.    {
  183.     bcnt=0;
  184.     mfst=AvailMem(MEMF_FAST);
  185.     fav=mfst;
  186.     printf("\n\n Allocating FAST memory\n\n");
  187.     printf("\nAvailable bytes %8ld\n",mfst);
  188.     while(mfst>MINLEFT)
  189.      {
  190.       if(getmem(mfst,MEMF_FAST))
  191.        {
  192.         TMB[FAST][fstcnt].adx=MB.adx;
  193.         TMB[FAST][fstcnt].cnt=MB.cnt;
  194.         mfst-=MB.cnt;
  195.         bcnt+=MB.cnt;
  196.         fstcnt++;
  197.        }
  198.      }
  199.     fnu=fav-bcnt;
  200.    }
  201.   if(cflag)
  202.    {
  203.     bcnt=0;
  204.     mchp=AvailMem(MEMF_CHIP);
  205.     cav=mchp;
  206.     printf("\n\n Allocating CHIP memory\n\n");
  207.     printf("\nAvailable bytes %8ld\n",mchp);
  208.     while(mchp>MINLEFT)
  209.      {
  210.       if(getmem(mchp,MEMF_CHIP))
  211.        {
  212.         TMB[CHIP][chpcnt].adx=MB.adx;
  213.         TMB[CHIP][chpcnt].cnt=MB.cnt;
  214.         mchp-=MB.cnt;
  215.         bcnt+=MB.cnt;
  216.         chpcnt++;
  217.        }
  218.      }
  219.     cnu=cav-bcnt;
  220.    }
  221.   if(fflag+cflag==2) bflag=TRUE;
  222.   while(ok)
  223.    {
  224.     if(bflag)
  225.      {
  226.       cflag=FALSE;
  227.       fflag=FALSE;
  228.       printf("\n\nEnter which memory type to test? { 0 = FAST    1 = CHIP } ");
  229.       scanf("%1ld",&inpt);
  230.       if(inpt==FAST) fflag=TRUE;
  231.       if(inpt>FAST) cflag=TRUE;
  232.      }
  233.     if(fflag) mtype=FAST;
  234.     if(cflag) mtype=CHIP;
  235.     printblocks(mtype);
  236.     printf("\n\nEnter block number to test? { 0 = all } ");
  237.     scanf("%ld",&mblk);
  238.     tf=FALSE;
  239.     if(!mblk) tf=TRUE;
  240.     if(tf) testall(mtype);
  241.     if(!tf)
  242.      {
  243.       mblk--;
  244.       printf("\n\nEnter number of iterations? ");
  245.       scanf("%ld",&itcnt);
  246.       testblock(mblk,mtype);
  247.      }
  248.     printf("\n\nContinue testing?  { 0 = exit program   1 = continue } ");
  249.     scanf("%ld",&ok);
  250.    }
  251.   closeup(fstcnt,chpcnt);
  252.  }
  253.